#include<iostream>
// #include<bits/stdc++.h>
#define maxn 100005
using namespace std;
struct gx{
    long long a;
    long long b;
    int c;
};
gx a[maxn];
long long  c[maxn*2];
long long d[maxn*2];
long long fa[maxn*2];

int find(int x){
    if(fa[x]){
        fa[x]=find(fa[x]);
        return fa[x];
    }
    else return x;
}
void merge(int x,int y){
    x=find(x);
    y=find(y);
    if(x!=y)fa[x]=y;
}

int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        memset(fa,0,sizeof(fa));
        int t;
        cin>>t;
        int top=0;
        for(int j=1;j<=t;j++){
            cin>>a[j].a>>a[j].b>>a[j].c;
            c[++top]=a[j].a;
            c[++top]=a[j].b;
        }
        sort(c+1,c+1+top);
        int ctop=0;
        for(int j=1;j<=top;j++){
            if(c[j]!=c[j-1]){
                d[++ctop]=c[j];
            }
        }
        for(int j=1;j<=t;j++){
            a[j].a=lower_bound(d+1,d+1+ctop,a[j].a)-d;
            a[j].b=lower_bound(d+1,d+1+ctop,a[j].b)-d;
        }
         for(int j=1;j<=t;j++){
            if(a[j].c){
                merge(a[j].a,a[j].b);
            }
        }
        int bj=0;
        for(int j=1;j<=t;j++){
           if(!a[j].c){
            int x=find(a[j].a);
             int y=find(a[j].b);
            if(x==y){
                cout<<"NO"<<endl;
                bj=1;
                break;
            }
           }
        }
        if(!bj)cout<<"YES"<<endl;
    }
    return 0;
}